/*
 * celda.h
 *
 *  Created on: 15/02/2010
 *      Author: rromero
 */

#ifndef CELDA_H_
#define CELDA_H_

#include <set>
#include <iostream>

using namespace std;

class celda {
	public:
		/**
			@brief Constructor primitivo
			Crea un objeto celda vacio
		*/
		celda();
		
		/**
			@brief Destructor primitivo
			Destruye un objeto celda
		*/
		~celda();
		
		/**
			@brief Nuevo valor 
			@param dato: Valor para asignar a la celda
			@param fija: Estado de la celda
			@return true si la celda ya es fija, es decir no se puede modificar
			@return	false en caso contrario
			Introduce un valor en una celda e indica si el mismo es o no fijo
		*/
		bool fijar_valor(const unsigned int &dato, const bool &fija = false);
		
		/**
			@brief Borrar Valor 
			Procedimiento que borra el contenido de una celda
		*/
		void borrar_valor();
		
		/**
			@brief Mostrar Valor
			@return	El Valor que contiene la celda
			Funcion que devuelve el valor que aloja la celda
		*/
		unsigned int valor() const;
		
		/**
			@brief Comprobar Celda
			@return true si la celda no esta vacia
			@return	false en caso contrario 
			Funcion observadora, muesta el estado de una celda
		*/
		bool valida() const;
		
		/**
			@brief Comprobar Celda Fija
			@return true si la celda esta fijada
			@return	false en caso contrario 
			Funcion observadora, muesta si se ha fijado una celda
		*/
		bool fija() const;
		
		/**
			@brief Nueva Opcion
			@param dato: el valor de la nueva opcion
			@return	true si el dato ha sido incluido
			@return	false el dato ya existe en las opciones 
			Funcion que guarda una nueva opcion en la celda
		*/
		bool nueva_opcion(const unsigned int &dato);
		
		/**
			@brief Borrar Opcion
			@param dato: el valor de la opcion para borrar
			@return	true si el dato ha sido borrado
			@return	false si el dato no existe en el conjunto de opciones 
			Funcion que borra una nueva opcion en la celda
		*/
		bool borrar_opcion(const unsigned int &dato);
		
		/**
			@brief Opciones
			@return	Conjunto de opciones de la celda
			Funcion que devuelve las opciones de la celda
		*/
		const set<unsigned int> opciones() const;
		
		/**
			@brief Operador de Asignacion
			@param otra: la celda para asignar a la actual
			@return	La celda con su nuevo valor
		*/
		celda& operator=(const celda &otra);
	private:
		bool 		      _fija;
		unsigned int	  _valor;
		set<unsigned int> _opciones;
};


/**
	@brief Sobrecarga del Operador <<
	@param os: flujo de salida para el dato
	@param c: celda que se envia al flujo de salida de datos
	@return	flujo de salida
	Sobrecarga del operador para enviar a la salida el TDA celda
*/
ostream& operator<<(ostream& os, const celda& c);

#endif /* CELDA_H_ */
